#ifndef __PHC_LIB_H__
#define __PHC_LIB_H__

#include "irc.h"
#include "phc_struct.h"			// PHC と共有する情報
#include "phc_internal.h"	// ライブラリユーザが見る必要のない情報

#ifdef __cplusplus
extern "C" {
#endif

/***********************************************************************
***********************************************************************/
  typedef struct{
	u8 _i[(sizeof(PHCImageData)+127)&0xFF80];
	u8 _c[(sizeof(PHCCourseData)+127)&0xFF80];
	u8 _r[(sizeof(DSRecordData)*(1+10)+127)&0xFF80];
  }_PHCEntryBuffer;

  typedef struct{
	u8 _p[(sizeof(PHCData)+127)&0xFF80];
	u8 _r[(sizeof(DSRecordData)*(1+10)+127)&0xFF80];
  }_PHCBackBuffer;

  typedef union{ // 最大限必要なバッファサイズを得るため
	_PHCEntryBuffer _e;
	_PHCBackBuffer _b;
  }_PHCBuffer;
/***********************************************************************
こちらのサイズはライブラリユーザは気にしなくてよい
***********************************************************************/
#define _COMPRESS_SIZE_BUF_LEN	((sizeof(_PHCBuffer)+127)/128) // 圧縮後サイズのリストバッファ(要4バイトアライメント)
/***********************************************************************
圧縮バッファのサイズ: for GAMEFREAK
***********************************************************************/
  #define PHC_COMPRESS_BUFFER_SIZE	(sizeof(_PHCBuffer) + _COMPRESS_SIZE_BUF_LEN) // 圧縮バッファトータル(要4バイトアライメント)
/***********************************************************************
イベントモード: for GAMEFREAK
***********************************************************************/
  typedef enum{
	EVENT_MODE_MAP = 		IR_EVENT_MAP,		// 配布マップ
	  EVENT_MODE_POKEMON =	IR_EVENT_POKEMON,	// 配布ポケモン
	  EVENT_MODE_ITEM = 	IR_EVENT_ITEM,		// 配布アイテム
	  EVENT_MODE_COURSE = 	IR_EVENT_COURSE,	// 配布コース

	  EVENT_MODE_STAMP0 =	IR_EVENT_STAMP0,	// 配布スタンプ
	  EVENT_MODE_STAMP1 =	IR_EVENT_STAMP1,	// 配布スタンプ
	  EVENT_MODE_STAMP2 =	IR_EVENT_STAMP2,	// 配布スタンプ
	  EVENT_MODE_STAMP3 =	IR_EVENT_STAMP3,	// 配布スタンプ

	  EVENT_MODE_NUM
  }EventMode;
/***********************************************************************
スタンプコンプ時にもらえるもの: for GAMEFREAK
***********************************************************************/
  typedef enum{
	STAMP_PRESENT_MAP,			// スタンプをコンプすると地図がもらえる
	  STAMP_PRESENT_POKEMON,	// スタンプをコンプするとポケモンがもらえる
	  STAMP_PRESENT_ITEM,		// スタンプをコンプするとアイテムがもらえる
	  STAMP_PRESENT_COURSE,		// スタンプをコンプするとコースがもらえる
	  STAMP_PRESENT_NONE,		// 何ももらえない(元からコース等配布する時にセット)
	  STAMP_PRESENT_NUM
  }STAMP_PRESENT;
/***********************************************************************
エラーコード: for GAMEFREAK
***********************************************************************/
  typedef enum{
	PHC_ERROR_NONE,					// エラーなし
	  PHC_ERROR_NOTCONNECT,		// 接続中でない
	  PHC_ERROR_TIMEOUT,			// タイムアウトエラー

	  PHC_ERROR_CHECKSUM,			// チェックサムエラー(IRCのチェックサムとは別)
	  PHC_ERROR_INITIALIZED,		// 既に登録済み(登録時)
	  /*****************************************************************
      このあたりのエラーはまとめて「この相手とは通信できない」でいいと思います
	  *****************************************************************/
	  PHC_ERROR_NOT_INITIALIZED,	// 未登録(登録時以外)
	  PHC_ERROR_EMPTY,				// ポケモンを預かっていないPHC(引き取り時)
	  PHC_ERROR_NOT_EMPTY,			// ポケモンを預かっているPHC(預け時)
	  PHC_ERROR_MUCH_COUNTRY,		// 国一致チェックエラー
	  PHC_ERROR_MUCH_ROM,			// ROMバージョン一致チェックエラー
	  PHC_ERROR_MUCH_COM,			// 通信バージョン一致チェックエラー
	  PHC_ERROR_MUCH_TRAINER,		// トレーナーID 一致チェックエラー
	  PHC_ERROR_MUCH_UNIT,				// この機器 とは通信できない
	  PHC_ERROR_EVENT_ALREADY,		// この配布データは既に受け取っている

	  PHC_ERROR_MUCH_PHC,				// PHCがDSの送ったステータスにNGを返してきた
	  /*****************************************************************
	  *****************************************************************/
	  PHC_ERROR_DONE,				// 正常終了

	  PHC_ERROR_NUM
  }PHCError;
/***********************************************************************
ユーザ関数: for GAMEFREAK
***********************************************************************/
  extern void PHC_Init(void *stack, u32 size, u32/*OSPriority:Wii*/prio); // 初期化関数
  extern void PHC_SetStatusBuffer(PHCStatus *status_ds, PHCStatus *status_phc); // 登録情報を読み書きするバッファを指定
  extern void PHC_SetCompressBuffer(void *buf); // 圧縮用バッファを指定(4バイトアラインのPHC_COMPRESS_BUFFER_SIZE バイトのバッファが必要です)
  extern void PHC_Entry(PHCImageData *pImage, PHCCourseData *pCourse, DSRecordData *pRecord); // 登録済みの確認をする
  //extern void PHC_Entry(ImageData *pImage, PokemonCourse *pCourse, DSRecordData *pRecord, BOOL comfirmFlag); // 登録:最後の引数は登録済みの確認をするかどうか
  extern void PHC_Back(PHCRentalData *pRental, PHCData *pData, PHCDistributeData *pDistribute, DSRecordData *pRecord); // ポケモンを引き取る
  //extern void PHC_Put(PHCCourseData *pCourse, DSRecordData *pRecord); // ポケモンを預ける
  //extern void PHC_Put(PHCCourseData *pCourse, DSRecordData *pRecord, PHCData *pData); // ポケモンを預ける
  extern void PHC_Put(PHCCourseData *pCourse, DSRecordData *pRecord, PHCData *pData, PHCDistributeData *pDistribute); // ポケモンを預ける

  extern void PHC_Present(PHCData *pData, DSRecordData *pRecord);

  extern void PHC_Cleanup(BOOL isDeleteTotalStep); // PHC 初期化(トータル歩数をクリアするかどうか)

  extern BOOL PHC_IsConnect(void); // 接続の確認
  extern u8 PHC_GetProcess(void);		// プロセスバー表示用データ単位の処理進行度取得(0-255が返る255 で終了)
  extern u8 PHC_GetTotalProcess(void);	// プロセスバー表示用トータル処理進行度取得(0-255が返る255 で終了)
  extern PHCError PHC_GetError(void); // エラーチェック関数
  extern void PHC_Dispose(void); // ライブラリ終了関数(スレッドが止まります)
/***********************************************************************
配布イベント用関数: for GAMEFREAK
EventMode:		(直接)何を配るか
STAMP_PRESENT:	スタンプを全て集めると何がもらえるか

PHCDistributeData やPHCDistributeCourse には
配布するデータだけセットすれば大丈夫ですが、
スタンプの場合は報酬として配布するもののデータもセットしてください

PHCDistributeData 内のPHCDistributeInfo は相手PHCの配布データ保持情報で
上書きされます(DS側は特に設定は必要ありません)
***********************************************************************/
extern void PHC_Event(EventMode mode, STAMP_PRESENT present, PHCData *pData, PHCDistributeData *pDistribute, PHCDistributeCourse *pCourse, DSRecordData *pRecord); // イベントDS用関数
/***********************************************************************
デバッグ用関数
FactoryInit と Cleanup の違い: ユニークID を書き込むかどうか・イベント受け取りフラグをクリアするかどうか
***********************************************************************/
  typedef enum{
  PHC_TEST_MODE_WRITE,
	PHC_TEST_MODE_VERIFY,
	PHC_TEST_MODE_DIRECT,	// 直接テストモードへ
	PHC_TEST_MODE_PRODUCT,	// 製品トップ画面へ
	PHC_TEST_MODE_NUM
  }PHCTestMode;

  typedef enum{
	PHC_LCD_SII,
	  PHC_LCD_WINTEK,
	  PHC_LCD_HOSIDEN,
	  PHC_LCD_NUM
  }PHCLCDType;

  extern void PHC_FactoryInit(void); // 工場出荷時の状態にするので製品では呼ばないでください
  //extern void PHC_Viewer(u8 *data);	// ビューワモード用ポケモン画像大量転送
  //extern void PHC_Font(u8 *data);	// デバッグ用フォント転送

  //extern void PHC_Test(u8 mode, u8 company); // 0: 書き込み 1: べリファイ 2: 直接検査へ 3: 製品トップ画面へ
  extern void PHC_Test(u8 mode, u8 company, PHCCountParam *pPrm);
  extern void PHC_Count(PHCCountParam *pPrm); //extern void PHC_Count(u8 *param);
  extern void PHC_Battery(u16 value);
/***********************************************************************
***********************************************************************/
#ifdef __cplusplus
} /* extern "C" */
#endif

#endif
